home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
AMICUS
/
AMICUS02.ADF
/
C
/
fixobj.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-05-30
|
2KB
|
71 lines
/* FIXOBJ : cleanup routine for Amiga Object files (c) 1985 John Hodgson
Note : FIXOBJ attempts to remove last record filler by truncating all
information past the last HUNK_END, providing the HUNK_END sequence
is within the last 128-byte record. The algorithm used here could be
thwarted if end-of-file filler happens to contain a bogus HUNK_END, or
if a particular load file ends with anything besides HUNK_END.
*/
#include <lattice/stdio.h>
/* constant definitions */
#define MAX16 (0xffff)
#define REVHUNK_END (0xf203)
#define BYTEBITS (8)
#define ENDOFFSET (2)
main(argc,argv)
int argc;
char *argv[];
{
FILE *rdptr,*wrtptr,*fopen();
int pos;
unsigned int media;
long ctr;
if (argc!=3) {
printf("Usage : fixobj srcfile destfile\n");
exit(0);
}
if ((rdptr=fopen(argv[1],"r"))==NULL) {
printf("Error opening file %s for reading.\n",argv[1]);
exit(0);
}
/* search last record backwards for HUNK_END combo in reverse order */
media=0;
for (ctr=-1;ctr>-128;ctr--) {
/* simulate a 16-bit shift register for easy hunk check */
media=(media<<BYTEBITS)&MAX16;
fseek(rdptr,ctr,ENDOFFSET);
media|=getc(rdptr);
if (media == REVHUNK_END) break;
}
if ((media!=REVHUNK_END) || ctr==-2) {
(ctr==-2) ? printf("No corrections made!\n"):
printf("Invalid load format!\n");
fclose(rdptr);
exit(0);
}
if ((wrtptr=fopen(argv[2],"w"))==NULL) {
printf("Error opening file %s for writing.\n",argv[2]);
fclose(rdptr);
exit(0);
}
/* duplicate file up to HUNK_END, inclusive */
pos=ftell(rdptr)+1;
rewind(rdptr);
for (ctr=0;ctr<pos;ctr++) putc(getc(rdptr),wrtptr);
fclose(rdptr); fclose(wrtptr);
}